import java.util.Stack;

/*
 * @lc app=leetcode.cn id=224 lang=java
 *
 * [224] 基本计算器
 */

// @lc code=start
class Solution {
    public int calculate(String s) {
        // 注意要用栈匹配括号，比较麻烦，注意没有乘法
        // 我在PTA写过这道题吧，看了一眼，那道题是要求算两个数的加减乘除，并按规定输出
        // 好像就是用栈,是不是要考虑中缀转后缀来着？哦，没有乘除，那不用这么麻烦,中缀转后缀是一种更通用的解法。
        
        Stack<Integer> stk = new Stack<>(); 
        int sign = 1;//代表+，如为-1代表减
        int ans = 0;
        int len = s.length();
        for(int i = 0; i<len ;i++){
            char c = s.charAt(i);
            if(Character.isDigit(c)){//是数字
                int cur  = c-'0';
                while(i+1<len && Character.isDigit(s.charAt(i+1))){//如果后面一个值是数字
                    cur = cur*10+ s.charAt(++i) - '0';
                }
                ans = sign*cur+ans;
            }else if(c == '+'){
                sign = 1;
            }else if(c == '-'){
                sign = -1;
            }else if (c == '('){
                //把当前计算的结果和数字入栈
                stk.push(ans);
                stk.push(sign);
                ans = 0;
                sign = 1;
            }else if (c == ')'){//出栈
                ans = stk.pop()*ans + stk.pop();
            }

        }
        return ans;
    }
}
// @lc code=end

